package com.niit.syy.Floor_area_ratio;

import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Floor_area_ratioReducer extends Reducer<Text, Text,Text,Text> {

    @Override
    protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
        HashMap<String, Integer>  floorTypeCounts = new HashMap<>(); //创建一个HashMap，用来统计每种楼层出现的次数，键是楼层字符串，值是该楼层出现的频次，初始化为空。
        int totalFloors = 0; // 初始化一个计数器totalFloors，用于统计所有楼层的总数。


        for (Text val : values) {
            String[] parts = val.toString().split(" \\(共"); // 分割字符串以提取楼层类型
            if (parts.length > 0) {
                String floorType = parts[0].trim(); // 获取楼层类型
                floorTypeCounts.put(floorType, floorTypeCounts.getOrDefault(floorType, 0) + 1);
                totalFloors++;
            }
        }

        StringBuilder outputBuilder = new StringBuilder(); // 创建一个StringBuilder对象，用于高效地拼接输出结果字符串。
        for (Map.Entry<String, Integer> entry :  floorTypeCounts.entrySet()) { // 遍历floorCounts这个HashMap的所有键值对，获取每个楼层及其对应的出现次数
            double percentage = (double) entry.getValue() / totalFloors * 100; // 计算当前楼层出现次数占总楼层数的百分比，先将出现次数转为double类型再做除法运算，最后乘以 100。
            outputBuilder.append(entry.getKey()).append("占比 ").append(String.format("%.2f", percentage)).append("%, "); // 将楼层信息、占比信息拼接到outputBuilder中，String.format("%.2f", percentage)用于保留两位小数格式化百分比数值。
        }

        if (outputBuilder.length() > 0) { // 检查outputBuilder是否已经有拼接内容，如果有则执行下一步。
            outputBuilder.setLength(outputBuilder.length() - 2); // 移除最后的逗号和空格
        }

        // 输出<市辖区, 各楼层占比>
        context.write(key, new Text(outputBuilder.toString()));
    }
}

